package com.ctrip.study.crawler.priceImage;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.io.FileUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

public class TongChengPriceCrawler {
	private final static int imgWidth = 17;
	// 价格图片css属性【width:17px】
	private final static int imgHeight = 37;
	// 价格图片css属性【height:37px】
	private final static int validPositionTop = 7;
	// 价格图片css属性【position-top:-7px】

	

	public static void main(String[] args) throws Exception {
		TongChengPriceCrawler cralwer = new TongChengPriceCrawler();
		String url = "http://www.ly.com/zizhuyou/suzhou226/44858-xianlu/";
		cralwer.crawlingPrice(url);
	}

	public List<TongChengTravelBean> crawlingPrice(String url) throws Exception {
		List<TongChengTravelBean> travelList = new ArrayList<TongChengTravelBean>();
		WebClient webClient = new WebClient(BrowserVersion.FIREFOX_24);
		webClient.getOptions().setJavaScriptEnabled(true);
		webClient.getOptions().setCssEnabled(false);
		webClient.setAjaxController(new NicelyResynchronizingAjaxController());
		webClient.getOptions().setTimeout(10000);
		webClient.getOptions().setThrowExceptionOnScriptError(false);
		
		HtmlPage page= webClient.getPage(url);
		Thread.sleep(10000);//主要是这个线程的等待 因为js加载也是需要时间的
		HtmlElement element = page.getBody();
		String content = element.asXml();
		FileUtils.writeStringToFile(new File("E:/data.txt"), element.asXml(), false);
		Document htmlDocument = Jsoup.parse(content);
		
//		Command command = getCommand(url);
//		Response response = new Response();
//		executor.executeGetGzip(command, response);
//		if (null != response.getContent()
//				&& response.getResultCode() == Response.Success) {
//			String content = new String(response.getContent());
//			Document htmlDocument = Jsoup.parse(content);
//			Map<String, String> priceMap = getPriceMap(htmlDocument);
//			Elements productElements = getTongChengProductList(htmlDocument);
//			for (Element el : productElements) {
//				TongChengTravelBean travelBean = new TongChengTravelBean();
//				travelBean.setTitle(getTongChengProductTitle(el));
//				travelBean.setUrl(getTongChengProductUrl(el));
//				travelBean.setPrice(getTongChengProductPrice(htmlDocument, el,
//						priceMap));
//				travelList.add(travelBean);
//			}
//		}
		return travelList;
	}

//	private Elements getTongChengProductList(Document htmlDocument) {
//		Elements elements = getElementsByCss(htmlDocument,
//				"div.router_content.clearfix");
//		return elements;
//	}
//
//	private String getTongChengProductTitle(Element element) {
//		return getElementByCss(element, "div.middle > h4 > a:eq(0)").attr(
//				"title");
//	}
//
//	private String getTongChengProductUrl(Element element) {
//		return "http://www.17u.cn"
//				+ getElementByCss(element, "div.middle > h4 > a:eq(0)").attr(
//						"href");
//	}
//
//	private float getTongChengProductPrice(Document htmlDocument,
//			Element element, Map<String, String> priceMap) {
//		String priceClassStr = getPriceClassStr(element);
//		String price = "";
//		String[] priceArr = priceClassStr.split(",");
//		for (int i = 0; i < priceArr.length; i++) {
//			if (priceMap.get(priceArr[i]) != null)
//				price += priceMap.get(priceArr[i]);
//		}
//		return NumberUtils.toFloat(price);
//	}
//
//	/**
//	 * 获取每个产品对应价格的cssClass
//	 * 
//	 * @param element
//	 * @return
//	 */
//	private String getPriceClassStr(Element element) {
//		Elements priceEls = getElementsByCss(element,
//				"div.right > div.price > strong > span > span");
//		String result = "";
//		for (Element el : priceEls) {
//			if ("".equals(result))
//				result = el.className();
//			else
//				result = result + "," + el.className();
//		}
//		return result;
//	}
//
//	/**
//	 * 获取cssClass和价格的映射
//	 * 
//	 * @param htmlDocument
//	 * @return
//	 */
//	private Map<String, String> getPriceMap(Document htmlDocument) {
//		Map<String, String> priceMap = new HashMap<>();
//		List<CssBean> cssBeanList = crawlingCss(htmlDocument);
//		if (cssBeanList.size() == 0)
//			return null;
//		String imgUrl = cssBeanList.get(0).getImgUrl();
//		BufferedImage image = crawlingImg(imgUrl);
//		if (image == null)
//			return priceMap;
//		for (CssBean cssBean : cssBeanList) {
//			int positionLeft = cssBean.getPositionLeft();
//			int positionTop = cssBean.getPositionTop();
//			if (image.getHeight() < (imgHeight + positionTop)
//					|| image.getWidth() < (imgWidth + positionLeft))
//				continue;
//			BufferedImage bi = image.getSubimage(positionLeft, positionTop,
//					imgWidth, imgHeight);
//			// 图片解析
//			priceMap.put(cssBean.getClassName(), CharacterProcess.getChar(bi));
//		}
//		return priceMap;
//	}
//
//	/**
//	 * 从页面爬取图片
//	 * 
//	 * @param imgUrl
//	 * @return
//	 */
//	private BufferedImage crawlingImg(String imgUrl) {
//		Command command = getCommand(imgUrl);
//		Response response = new Response();
//		executor.executeGetGzip(command, response);
//		BufferedImage image = null;
//		if (response.getResultCode() == Response.Success) {
//			try {
//				image = ImageIO.read(new ByteArrayInputStream(response
//						.getContent()));
//			} catch (IOException e) {
//				e.printStackTrace();
//			}
//		}
//		return image;
//	}
//
//	/**
//	 * 从页面爬取CSS信息
//	 * 
//	 * @param htmlDocument
//	 * @return
//	 */
//	private List<CssBean> crawlingCss(Document htmlDocument) {
//		List<CssBean> result = new ArrayList<>();
//		String cssUrl = getElementByCss(htmlDocument,
//				"div.routers_list_wrapper").attr("data-css-link");
//		if (StringUtils.isBlank(cssUrl))
//			return result;
//		Command command = getCommand(cssUrl);
//		Response response = new Response();
//		executor.executeGetGzip(command, response);
//		if (null != response.getContent()
//				&& response.getResultCode() == Response.Success) {
//			String cssContent = new String(response.getContent());
//			result = parsePriceCss(cssContent, validPositionTop);
//		}
//		return result;
//	}
//
//	/**
//	 * 解析css文件
//	 * 
//	 * @param css
//	 * @param validPositionTop
//	 * @return
//	 */
//	private List<CssBean> parsePriceCss(String css, int validPositionTop) {
//		Pattern posPattern = Pattern
//				.compile("background.*no-repeat .* *-(\\d+)px *-(\\d+)px");
//		Pattern urlPattern = Pattern
//				.compile("background:url\\(\\\'([^\\\"]*)\\\'\\)");
//		List<CssBean> result = new ArrayList<>();
//		if (StringUtils.trimToNull(css) != null) {
//			String[] lines = css.split("}.");
//			for (int i = 0; i < lines.length; i++) {
//				CssBean cssBean = new CssBean();
//				String[] cssArr = lines[i].split("\\{");
//				String className = cssArr[0];
//				if (className.startsWith("."))
//					className = className.substring(1);
//				cssBean.setClassName(className);
//				if (cssArr.length > 1) {
//					Matcher matcherUrl = urlPattern.matcher(cssArr[1]);
//					if (matcherUrl.find()) {
//						cssBean.setImgUrl(matcherUrl.group(1));
//					}
//					Matcher matcherPosition = posPattern.matcher(cssArr[1]);
//					if (matcherPosition.find()) {
//						cssBean.setPositionLeft(NumberUtils
//								.toInt(matcherPosition.group(1).trim()));
//						if (matcherPosition.groupCount() >= 2)
//							cssBean.setPositionTop(NumberUtils
//									.toInt(matcherPosition.group(2).trim()));
//					}
//				}
//				if (cssBean.getPositionTop() == validPositionTop)
//					result.add(cssBean);
//			}
//		}
//		return result;
//	}
//
//	private Command getCommand(String url) {
//		Command command = new Command();
//		command.setUrl(url);
//		command.addHeader("Accept",
//				"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
//		command.addHeader("Accept-Language",
//				"zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3");
//		command.addHeader("Accept-Encoding", "gzip,deflate");
//		command.addHeader(
//				"User-Agent",
//				"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36");
//		command.addHeader("Connection", "keep-alive");
//		command.addHeader("Host", getHost(url));
//		return command;
//	}
//
//	private String getHost(String url) {
//		String host = "";
//		if (url != null && url.trim().length() > 0) {
//			try {
//				URL url_ = new URL(url);
//				host = url_.getHost();
//			} catch (MalformedURLException e) {
//				e.printStackTrace();
//			}
//		}
//		return host;
//	}
//
//	private Elements getElementsByCss(Document document, String cssQuery) {
//		Elements result = new Elements();
//		if (document == null)
//			return result;
//		if (org.apache.commons.lang.StringUtils.isBlank(cssQuery))
//			return result;
//		result = document.select(cssQuery);
//		return result;
//	}
//
//	private Element getElementByCss(Document document, String cssQuery) {
//		Tag tag = Tag.valueOf("mytag");
//		Element result = new Element(tag, "");
//		if (document == null)
//			return result;
//		if (org.apache.commons.lang.StringUtils.isBlank(cssQuery))
//			return result;
//		Elements elements = document.select(cssQuery);
//		if (elements.size() > 0)
//			result = elements.first();
//		return result;
//	}
//
//	private Element getElementByCss(Element element, String cssQuery) {
//		Tag tag = Tag.valueOf("mytag");
//		Element result = new Element(tag, "");
//		if (element == null)
//			return result;
//		if (org.apache.commons.lang.StringUtils.isBlank(cssQuery))
//			return result;
//		Elements elements = element.select(cssQuery);
//		if (elements.size() > 0)
//			result = elements.first();
//		return result;
//	}
//
//	private Elements getElementsByCss(Element element, String cssQuery) {
//		Elements result = new Elements();
//		if (element == null)
//			return result;
//		if (org.apache.commons.lang.StringUtils.isBlank(cssQuery))
//			return result;
//		result = element.select(cssQuery);
//		return result;
//	}
}
